home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
asmutil
/
dasm80.zip
/
DASM80.ASM
< prev
next >
Wrap
Assembly Source File
|
1986-07-22
|
30KB
|
1,075 lines
.XALL
PAGE ,132
TITLE DASM80 - 14 SEP 1985
; ****************************************************************
; ** **
; ** MS-DOS 8080/8085 DISASSEMBLER **
; ** **
; **............................................................**
; ** **
; ** DASM80 DISASSEMBLES 8080/8085 INTEL HEX FILES. **
; ** **
; ****************************************************************
; ..... MODULE CONNECTION POINTS .....
EXTRN MNEM:NEAR ; MNEMONIC TABLE
EXTRN BYTES:NEAR ; BYTES TABLE
; ..... MACROS .....
DISKRD MACRO NUMBYTE ; READ SPECIFIED NUMBER OF BYTES FROM DISK
LOCAL OK ; OK IS A LOCAL SYMBOL
MOV AH,READ ; LOAD READ COMMAND
MOV BX,RDHAND ; LOAD READ FILE HANDLE
MOV CX,NUMBYTE ; LOAD NUMBER OF CHARACTERS TO BE READ
MOV DX,OFFSET DSKBUF; POINT TO DISK BUFFER
INT DOSFUNC ; READ FROM INPUT FILE - ERROR?
JNC OK ; NO - DONE
JMP DSKERR ; YES - DISPLAY ERROR
OK:
ENDM ;
DISKWR MACRO NUMBYTE ; WRITE SPECIFIED NUMBER OF BYTES TO DISK
LOCAL OK ; OK IS A LOCAL SYMBOL
MOV AH,WRITE ; LOAD WRITE COMMAND
MOV BX,WRHAND ; LOAD WRITE FILE HANDLE
MOV CX,NUMBYTE ; LOAD NUMBER OF CHARACTERS TO WRITE
MOV DX,OFFSET DSKBUF; POINT TO DISK BUFFER
INT DOSFUNC ; WRITE TO OUTPUT - ERROR?
JNC OK ; NO - DONE
JMP DSKERR ; YES - DISPLAY ERROR
OK:
ENDM ;
PAGE
; ..... DOS COMMANDS .....
DOSFUNC EQU 21H ; DOS FUNCTION INTERRUPT
PR_STR EQU 09H ; DOS FUNCTION PRINT STRING COMMAND
CREATE EQU 3CH ; CREATE FILE COMMAND
OPEN EQU 3DH ; OPEN FILE COMMAND
CLOSE EQU 3EH ; CLOSE FILE COMMAND
READ EQU 3FH ; READ FILE COMMAND
WRITE EQU 40H ; WRITE FILE COMMAND
RDACC EQU 0 ; READ FILE ACCESS CODE
WRACC EQU 1 ; WRITE FILE ACCESS CODE
WRATT EQU 0 ; WRITE FILE ATTRIBUTE CODE
; ..... CONSTANTS .....
MEMLEN EQU 2000H ; LENGTH OF MEMORY BUFFER
MAXLEN EQU 80 ; MAXIMUM FILE NAME LENGTH
CR EQU 0DH ; ASCII <CR>
LF EQU 0AH ; ASCII LINE FEED
RS EQU 1EH ; ASCII RECORD SEPARATOR
TAB EQU 09H ; ASCII TAB
DATIND EQU 00H ; HEX FILE DATA RECORD INDICATOR
EOFIND EQU 01H ; HEX FILE END OF FILE INDICATOR
PAGE
STACK SEGMENT STACK ; STACK SEGMENT
DW 1024 DUP (?) ; 1024 LEVELS OF STACK
STACK ENDS
DATA SEGMENT PUBLIC ; DATA SEGMENT
; ****************************************************************
; ** **
; ** MISCELLANEOUS STRINGS **
; ** **
; ****************************************************************
MSGORG DB ';',CR,LF,TAB,'ORG',TAB,'0'
LENORG EQU $-MSGORG
MSGEND DB ';',CR,LF,TAB,'END',CR,LF
LENEND EQU $-MSGEND
; ****************************************************************
; ** **
; ** ERROR STRINGS **
; ** **
; ****************************************************************
MBCOM DB CR,LF,'COMMAND LINE ERROR',CR,LF,LF,'$'
MBHEX DB CR,LF,'BAD HEX DATA',CR,LF,LF,'$'
MDISK0 DB CR,LF,'ERROR 0 - DISK FULL',CR,LF,LF,'$'
MDISK1 DB CR,LF,'ERROR 1 - INVALID FUNCTION',CR,LF,LF,'$'
MDISK2 DB CR,LF,'ERROR 2 - FILE NOT FOUND',CR,LF,LF,'$'
MDISK3 DB CR,LF,'ERROR 3 - PATH NOT FOUND',CR,LF,LF,'$'
MDISK4 DB CR,LF,'ERROR 4 - TOO MANY OPEN FILES',CR,LF,LF,'$'
MDISK5 DB CR,LF,'ERROR 5 - ACCESS DENIED',CR,LF,LF,'$'
MDISK6 DB CR,LF,'ERROR 6 - INVALID FILE HANDLE',CR,LF,LF,'$'
MUKNOW DB CR,LF,'UNKNOWN DISK ERROR',CR,LF,LF,'$'
PAGE
; ****************************************************************
; ** **
; ** PROGRESS MESSAGE STRINGS **
; ** **
; ****************************************************************
MRCOM DB CR,LF,'READING COMMAND LINE',CR,LF,'$'
MOPENR DB 'OPENING READ FILE',CR,LF,'$'
MCHEX DB 'CONVERTING HEX FILE',CR,LF,'$'
MOPENW DB 'CLOSING READ AND OPENING WRITE FILE',CR,LF,'$'
MDISS DB 'DISASSEMBLING CONVERTED DATA',CR,LF,'$'
MCLOSW DB 'CLOSING WRITE FILE',CR,LF,'$'
MEXIT DB 'EXITING TO DOS',CR,LF,LF,'$'
PAGE
; ****************************************************************
; ** **
; ** MEMORY ASSIGNMENTS **
; ** **
; ****************************************************************
DSKBUF DB 80 DUP (?) ; DISK I/O BUFFER
DSKCNT DW (?) ; DISK BUFFER COUNTER
RDFILE DB MAXLEN+1 DUP (0); INPUT FILE NAME BUFFER
WRFILE DB MAXLEN+1 DUP (0); OUTPUT FILE NAME BUFFER
RDHAND DW (?) ; READ FILE HANDLE
WRHAND DW (?) ; WRITE FILE HANDLE
CHKACC DB (?) ; CHECKSUM ACCUMULATOR
DSKPTR DW (?) ; DISK BUFFER POINTER
MEMPTR DW (?) ; MEMORY POINTER
MEMCNT DW (?) ; MEMORY COUNTER
NUMREC DW (?) ; NUMBER OF RECORDS IN CURRENT LINE
RECNUM DW (?) ; NUMBER OF BYTES FOR NUMREC RECORDS
CURADD DW (?) ; CURRENT ADDRESS
DB (0) ; DUMMY START OF MEMBUF
MEMBUF DB MEMLEN DUP (0) ; MEMORY BUFFER
DATA ENDS
PAGE
CODE SEGMENT ; CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
; ****************************************************************
; ** **
; ** MAIN PROGRAM **
; ** **
; ****************************************************************
DASM80 PROC FAR ;
PUSH DS ;
MOV AX,0 ;
PUSH AX ; SET UP FOR A FAR RETURN TO DOS
MOV AX,DATA ;
MOV DS,AX ; SET UP DATA SEGMENT REGISTER
MOV DX,OFFSET MRCOM ; POINT TO READING COMMAND LINE MESSAGE
CALL MSGCO ; WRITE MESSAGE TO STANDARD OUTPUT
CALL RCMD ; READ COMMAND LINE
MOV DX,OFFSET MOPENR; POINT TO OPENING INPUT FILE MESSAGE
CALL MSGCO ; WRITE MESSAGE TO STANDARD OUTPUT
CALL OPENRD ; OPEN INPUT FILE FOR READ
MOV DX,OFFSET MCHEX ; POINT TO CONVERTING HEX FILE MESSAGE
CALL MSGCO ; WRITE MESSAGE TO STANDARD OUTPUT
CALL CHEX ; CONVERT INPUT FILE
MOV DX,OFFSET MOPENW; POINT TO OPENING OUTPUT FILE MESSAGE
CALL MSGCO ; WRITE MESSAGE TO STANDARD OUTPUT
CALL OPENWR ; OPEN OUTPUT FILE FOR WRITE
MOV DX,OFFSET MDISS ; POINT TO DISASSEMBLING MESSAGE
CALL MSGCO ; WRITE MESSAGE TO STANDARD OUTPUT
CALL DISS ; DISASSEMBLE FILE
MOV DX,OFFSET MCLOSW; POINT TO CLOSING WRITE FILE MESSAGE
CALL MSGCO ; WRITE MESSAGE TO STANDARD OUTPUT
CALL CLOSWR ; DISASSEMBLE FILE
MOV DX,OFFSET MEXIT ; POINT TO EXITING MESSAGE
CALL MSGCO ; WRITE MESSAGE TO STANDARD OUTPUT
RET ; RETURN TO DOS
DASM80 ENDP ;
PAGE
; ****************************************************************
; ** **
; ** READ COMMAND LINE **
; ** **
; ****************************************************************
RCMD PROC NEAR ;
MOV BX,80H ; POINT TO NUMBER OF RECEIVED CHARACTERS
MOV CH,ES:[BX] ; LOAD NUMBER OF RECEIVED CHARACTERS
OR CH,CH ; ZERO CHARACTERS?
JZ RCMD25 ; YES - DISPLAY ERROR
INC BX ; NO - POINT TO CHARACTERS
MOV DI,OFFSET RDFILE; POINT TO INPUT FILE NAME BUFFER
MOV CL,MAXLEN ; LOAD MAXIMUM FILE NAME LENGTH
MOV AL,ES:[BX] ; READ NEXT CHARACTER
INC BX ; ADVANCE POINTER
DEC CH ; RETARD CHARACTER COUNTER - END?
JZ RCMD25 ; YES - DISPLAY ERROR
CMP AL,' ' ; NO - SPACE?
JNZ RCMD25 ; NO - DISPLAY ERROR
RCMD05:
MOV AL,ES:[BX] ; YES - READ NEXT CHARACTER
MOV [DI],AL ; WRITE TO INPUT FILE NAME BUFFER
CMP AL,' ' ; SPACE?
JZ RCMD10 ; YES - LOAD OUTPUT FILE NAME
INC BX ; NO -
INC DI ; - ADVANCE POINTERS
DEC CH ; RETARD CHARACTER COUNTER - END?
JZ RCMD25 ; YES - DISPLAY ERROR
DEC CL ; NO - RETARD FILE NAME COUNTER - TOO LONG?
JZ RCMD25 ; YES - DISPLAY ERROR
JMP RCMD05 ; NO - CONTINUE
RCMD10:
INC BX ; ADVANCE COMMAND LINE POINTER
DEC CH ; DECREMENT CHARACTER COUNTER - END?
JZ RCMD25 ; YES - DISPLAY ERROR
MOV DI,OFFSET WRFILE; NO - POINT TO OUTPUT FILE NAME BUFFER
MOV CL,MAXLEN ; LOAD MAXIMUM FILE NAME LENGTH
RCMD20:
MOV AL,ES:[BX] ; READ NEXT CHARACTER
CMP AL,' ' ; SPACE?
JZ RCMD25 ; YES - DISPLAY ERROR
MOV [DI],AL ; NO - WRITE TO OUTPUT FILE NAME BUFFER
INC BX ;
INC DI ; ADVANCE POINTERS
DEC CH ; RETARD COUNTER - LAST CHARACTER?
JZ RCMD30 ; YES - DONE
DEC CL ; NO - RETARD COUNTER - FILE NAME TOO LONG?
JZ RCMD25 ; YES - DISPLAY ERROR
JMP RCMD20 ; NO - CONTINUE
RCMD25:
MOV DX,OFFSET MBCOM ; POINT TO BAD COMMAND LINE MESSAGE
JMP MISERR ; DISPLAY ERROR MESSAGE AND E